package cn.kawa.exception;

import cn.kawa.enums.GlobalEnumCode;
import cn.kawa.result.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
@Component
@Slf4j
/**
 * 此类加了@RestControllerAdvice注解用于捕获全局异常，
 * 并返回JsonResult給前端（重载JsonResult.error方法，传入GlobalEnumCode对象）
 */
public class GlobalException {

    //此注解标识当前要捕捉的异常类型
    @ExceptionHandler(Exception.class)
    public JsonResult exceptionHandler(Exception e){
        e.printStackTrace();
        log.info("捕获了Exception异常");
        return JsonResult.error(GlobalEnumCode.ERROR);//error方法重载1
    }

    @ExceptionHandler(GlobalCustomException.class)
    public JsonResult globalCustomExceptionHandler(GlobalCustomException e){
        e.printStackTrace();
        log.info("捕获了GlobalCustomException异常");
        return JsonResult.error(e);//error方法重载12  JsonResult.error
    }

    /**
     * 用于捕获参数不合法异常
     * @param e - MethodArgumentNotValidException
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public JsonResult methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e){
        e.printStackTrace();
        StringBuffer strBuff = new StringBuffer();
        //去除 exception对象中我们自定的message集合，遍历后用流拼接到stringBuffer
        e.getBindingResult().getAllErrors().forEach(error->{
            strBuff.append(error.getDefaultMessage()).append(",");
        });
        strBuff.deleteCharAt(strBuff.length()-1);//去除最后一个逗号

        log.info("捕获了GlobalCustomException异常");
        //通过error传入两个String的有参返回对象
        return JsonResult.error(strBuff.toString(),"10000");
    }

}
